﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace iMario
{
    public class MonsterManager : EntityManager
    {
        //Mục đích Class MonsterManager
        //  - Tập trung các phương thức xử lí cho các đối tượng Monster

        //Danh sách các thuộc tính và ý nghĩa
        private ContentManager _content;                        //Đại diện cho content của game
        public ContentManager content
        {
            get { return _content; }
            set { _content = value; }
        }

        private Map _currentMap;                                //Đại diện cho map hiện tại đang được sử dụng
        public Map currentMap
        {
            get { return _currentMap; }
            set { _currentMap = value; }
        }

        List<KindOfSprite> _kindOfMonster;                      //Danh sách các frame hình cho các loại monster
        public List<KindOfSprite> kindOfMonster
        {
            get { return _kindOfMonster; }
            set { _kindOfMonster = value; }
        }

        //Danh sách các phương thức và ý nghĩa
        //Hàm dựng mặc định
        //  1. Tham số truyền vào: Không có
        //  2. Giá trị trả về: Không có
        public MonsterManager()
        { 
            //Hướng xử lí
            //  1. Khởi tạo giá trị các thuộc tính của đối tượng MonsterManager


            //Tiến hành
            //  1. Khởi tạo giá trị các thuộc tính của đối tượng MonsterManager
            _content = null;

            _currentMap = null;

            _kindOfMonster = new List<KindOfSprite>();

            prototypes = new List<GameObject>();
        }

        //Hàm khởi tạo giá trị ban đầu cho các thuộc tình
        //  1. Tham số truyền vào: Không có
        //  2. Giá trị trả về: Không có
        public void Initial()
        {
            //Do nothing here
        }

        //Hàm load content cho đối tượng MonsterManager
        //  1. Tham số truyền vào: Không có
        //  2. Giá trị trả về: Không có
        public void LoadContent()
        {
            //Hướng xử lí
            //Kiểm tra: Nếu giá trị _content khác null => Tiến hành tiếp các lệnh bên dưới
            //  1. Load danh sách các loại monster và lưu vào _kindOfMonster
            //  2. Khởi tạo đối tượng Monster và lưu vào List prototypes


            //Tiến hành
            //Kiểm tra: Nếu giá trị _content khác null => Tiến hành tiếp các lệnh bên dưới
            if (_content == null)
                return;

            //  1. Load danh sách các loại monster và lưu vào _kindOfMonster
            KindOfSprite _kind = new KindOfSprite(@"MushRoom", 3, new Point(32, 32));
            _kind.LoadContent();
            _kindOfMonster.Add(_kind);
        }

        //Hàm tạo 1 đối tượng Monster mới và thêm vào danh sách prototypes
        //  1. Tham số truyền vào
        //  2. Giá trị trả về: GameObject
        public override GameObject CreateObject(int _iKindOfMonster)
        {
            ////Hướng xử lí
            ////Kiểm tra: Nếu giá trị _iKindOfMonster nằm trong khoảng [0; _kindOfMonster.Count) => Thực hiện tiếp các lệnh phía dưới
            ////  Khởi tạo 1 đối tượng Monster mới với thuộc tính kind là đối tượng thứ _iKindOfMonster trong List kindOfMonster


            ////Tiến hành
            ////Kiểm tra: Nếu giá trị _iKindOfMonster nằm trong khoảng [0; _kindOfMonster.Count) => Thực hiện tiếp các lệnh phía dưới
            //if (_iKindOfMonster < 0 || _iKindOfMonster >= _kindOfMonster.Count)
            //    return null;

            ////  Khởi tạo 1 đối tượng Monster mới với thuộc tính kind là đối tượng thứ _iKindOfMonster trong List kindOfMonster
            //GameObject _newMonster = new Monster(_kindOfMonster[_iKindOfMonster]);


            //Tạm thời chưa xử lí
            return null;
        }

        //Hàm cập nhật trạng thái của các đối tượng Monster trong List prototypes
        //  1. Tham số truyền vào:
        //      - KeyboardState _keyboard: Đại diện cho trạng thái hiện tại của keyboard
        //      - MouseState _mouse: Đại diện cho trạng thái hiện tại của mouse
        //      - GameTime _gameTime
        //  2. Giá trị trả về: Không có
        public void Update(KeyboardState _keyboard, MouseState _mouse, GameTime _gameTime)
        {
            //Tạm thời chưa xử lí
        }

        //Hàm xử lí các thao tác vẽ cho các đối tượng Monster
        //  1. Tham số truyền vào
        //      - SpriteBatch _spriteBatch
        //      - GameTime _gameTime
        //  2. Giá trị trả về: Không có
        public void Draw(SpriteBatch _spriteBatch, GameTime _gameTime)
        {
            //Tạm thời chưa xử lí
        }

        //Hàm thiết lập giá trị thuộc tính isDead thành true cho đối tượng Monster trong list prototypes
        //  1. Tham số truyền vào:
        //      - int _iMonster: chỉ số của monster rơi vào trạng thái đã chết
        //  2. Giá trị trả về: Không có
        public void MakeMonsterDied(int _iMonster)
        {
            //Tạm thời chưa xử lí
        }

        //Hàm thiết lập giá trị cho thuộc tính _content của đối tượng MonsterManager
        //  1. Tham số truyền vào:
        //      - ContentManagement _inputContent: Đại diện cho content trong game
        //  2. Giá trị trả về: Không có
        public void SetContent(ContentManager _inputContent)
        {
            //Thiết lập giá trị content cho đối tượng MonsterManager
            _content = _inputContent;

            //Thiết lập giá trị content cho lớp đối tượng KindOfSprite
            KindOfSprite.SetContent(_content);
        }

        //Hàm thiết lập bản đồ hiện tại đang được sử dụng
        //  1. Tham số truyền vào
        //      - Map _map: Đại diện cho bản đồ hiện tại đang được sử dụng trong game
        //  2. Giá trị trả về: Không có
        public void SetCurrentMap(Map _map)
        {
            _currentMap = _map;
        }

        //Hàm thiết lập vị trí trên bản đồ cho đối tượng Monster có trong List _monsters
        //  1. Tham số truyền vào
        //      - Point _location: Vị trí của đối tượng
        //  2. Giá trị trả về: Không có
        public void SetLocation(Point _location)
        {
 
        }
    }
}
